#include "histogramtab.h"

HistogramTab::HistogramTab(QWidget *parent) :
    QWidget(parent)
{
    ui.setupUi(this);
}

HistogramTab::HistogramTab(QWidget *parent, float * histograme, Image::couleurHisto couleur, int nbPixelTot) :
    QWidget(parent)
{
    ui.setupUi(this);

    this->histograme = histograme;
    this->couleur = couleur;
    this->nbPixelTot = nbPixelTot;
    calculPourcentageMax();
    QString pourcentageMaxString;
    pourcentageMaxString.setNum (pourcentageMax, 'f');
    ui.labelMax->setText("Max = " + pourcentageMaxString + "%");

    creerHistograme();
}

HistogramTab::~HistogramTab()
{

}

void HistogramTab::creerHistograme()
{
    int i,j,k,l,max;
    int largeurAbscisse=3, largeurOrdonnee = 2;
    int tailleAxeAbscisse=5, tailleAxeOrdonnee=5, tailleBandeCouleur=5;
    int margeGauche=1,margeDroite=1,margeHaute=1,margeBasse=1;
    int bordureGauche=tailleAxeOrdonnee+margeGauche,bordureDroite=margeDroite,bordureHaute=margeHaute,bordureBasse=tailleAxeAbscisse+tailleBandeCouleur+margeBasse;
    int largeur=256*largeurAbscisse+bordureGauche+bordureDroite, hauteur=101*largeurOrdonnee+bordureHaute+bordureBasse;
    QRgb qcouleur;
    QColor cwhite = QColor("white"), cblack = QColor("black"), cgray = QColor("darkGray"), cred = QColor("red"), cgreen = QColor("green"), cblue = QColor("blue"), cyellow = QColor("yellow");

    QImage image(largeur,hauteur,QImage::Format_RGB32);

    //mettre l'image en blanc
    for(j=0;j<hauteur;j++)
    {
        for(i=0;i<largeur;i++)
        {
            image.setPixel(i,j,qRgb(cwhite.red(),cwhite.green(),cwhite.blue()));
        }
    }

    //créer les axes en noir
    for(i=margeGauche;i<largeur-margeDroite;i++)
        for(j=margeBasse+tailleBandeCouleur;j<bordureBasse;j++)
            image.setPixel(i,hauteur-j,qRgb(cblack.red(),cblack.green(),cblack.blue()));
    for(j=margeHaute;j<hauteur-margeBasse;j++)
        for(i=margeGauche;i<bordureGauche;i++)
            image.setPixel(i,hauteur-j,qRgb(cblack.red(),cblack.green(),cblack.blue()));

    //créer les graduations
    for(i=1;i<256;i++)
        if(i%50==0)
            for(k=0;k<largeurAbscisse;k++)
                for(j=margeBasse+tailleBandeCouleur;j<bordureBasse;j++)
                    image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-j,qRgb(cwhite.red(),cwhite.green(),cwhite.blue()));
    for(j=1;j<101;j++)
        if(j%25==0)
            for(l=0;l<largeurOrdonnee;l++)
                for(i=margeGauche;i<bordureGauche;i++)
                    image.setPixel(i,hauteur-(j*largeurOrdonnee+l+bordureBasse),qRgb(cwhite.red(),cwhite.green(),cwhite.blue()));

    //créer la bande de couleur
    for(i=0;i<256;i++)
    {
        switch(couleur)
        {
            case Image::gris :
                qcouleur = qRgb(i,i,i);
                break;
            case Image::rouge :
                qcouleur = qRgb(i,0,0);
                break;
            case Image::vert :
                qcouleur = qRgb(0,i,0);
                break;
            case Image::bleu :
                qcouleur = qRgb(0,0,i);
                break;
            default :
                qcouleur = qRgb(0,0,0);
        }

        for(k=0;k<largeurAbscisse;k++)
            for(j=margeBasse;j<margeBasse+tailleBandeCouleur;j++)
                image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-j,qcouleur);
    }

    //créer le fond pour vérification
    for(i=0;i<256;i++)
        for(j=0;j<101;j++)
            for(k=0;k<largeurAbscisse;k++)
                for(l=0;l<largeurOrdonnee;l++)
                    image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-(j*largeurOrdonnee+l+bordureBasse),qRgb(cyellow.red(),cyellow.green(),cyellow.blue()));

    //placer les valeurs
    switch(couleur)
    {
        case Image::gris :
            qcouleur = qRgb(cgray.red(),cgray.green(),cgray.blue());
            break;
        case Image::rouge :
            qcouleur = qRgb(cred.red(),cred.green(),cred.blue());
            break;
        case Image::vert :
            qcouleur = qRgb(cgreen.red(),cgreen.green(),cgreen.blue());
            break;
        case Image::bleu :
            qcouleur = qRgb(cblue.red(),cblue.green(),cblue.blue());
            break;
        default :
            qcouleur = qRgb(cwhite.red(),cwhite.green(),cwhite.blue());
    }
    for(i=0;i<256;i++)
    {
        max = calculMax(histograme[i],largeurOrdonnee);

        for(j=0;j<max && (hauteur-(j+bordureBasse))>-5;j++)
            for(k=0;k<largeurAbscisse;k++)
                image.setPixel(i*largeurAbscisse+k+bordureGauche,hauteur-(j+bordureBasse),qcouleur);
    }

    ui.labelPixmap->setPixmap(QPixmap::fromImage(image));

}

int HistogramTab::calculMax(float x, int largeurOrdonnee)
{
    float ratio = x / this->pourcentageMax * 100;
    float arrondi = arrondi1d(ratio);
    int pEntiere = floor(arrondi);
    float pDecimale=arrondi-pEntiere;
    int premiereDecimale=pDecimale*10.0;
    int offset = premiereDecimale*largeurOrdonnee/10;
    int r= pEntiere*largeurOrdonnee+offset;
    return r;
}

float HistogramTab::arrondi1d(float x)
{
    float temp1=x*100.;
    int chiffresSignificatifs = floor(temp1);
    int sansDernierChiffre = chiffresSignificatifs/10;
    int dernierChiffre = chiffresSignificatifs%10;
    if(dernierChiffre>=5)
        sansDernierChiffre++;
    return (float)sansDernierChiffre/10.;
}

void HistogramTab::calculPourcentageMax()
{
    int i;
    this->pourcentageMax = 0.;

    for(i=0;i<256;i++)
    {
        if(this->histograme[i]>this->pourcentageMax)
        {
            this->pourcentageMax = this->histograme[i];
        }
    }
}
